//条件类型
//和泛型的约束一起使用，类似三元运算符；泛型约束是用来约束泛型的（也包含了判断），条件是用来判断的------------------
type ResponseState<T extends number>= T extends 200 | 204 | 206 ? 'success':'fail'; //第一个extends是泛型约束，第二个extends是条件判断
type R1=ResponseState<100>;
type Conditional<T,U>=T extends U ?'success' :'fail';
type c1=Conditional<'zh',string>//success
type c2=Conditional<'zh',number>//fail

//---------------条件类型---------------------
interface Fish{
    name:string
}
interface Water{
    name:string
}
interface Bird{
    name:string
}
interface Sky{
    name:string
}

type S1<T>=T extends Bird?Sky:Water;
type S11=S1<Bird>
type S12=S1<string>

//---------------泛型代表输入是不确定的（无限的），可约束；函数重载（有限的）--------------------

// function sum<T>(a:T,b:T):T{
//     return a+b;
// }
//1、函数重载实现
type SS=string |number
function sum(a:string,b:string):string;
function sum(a:number,b:number):number;
function sum(a:SS,b:SS):SS{
    return a+(b as any);
}
const ss1=sum(1,2)
const ss2=sum('1','2')

//2、函数泛型实现
type Returnval<T extends  string | number>=T extends string ? string : T extends number ?  number : never; //第一个extends是泛型约束，第二个extends是条件判断
function sum1<T extends string | number>(a:T,b:T):Returnval<T>{
    return a+(b as any)
    // return a+b //泛型不能做数学运算 T+T?
}
const ff1=sum1(1,2)
const ff2=sum1('1','2')
export {}